﻿#pragma once

#include <stdio.h>		//标准输入输出(print,scanf,perror等)
#include <stdlib.h>		//system()等
#include <string.h>		//
#include <assert.h>		//assert()等
#include <windows.h>	//WINAPI相关操作，srand,sleep等
#include <stdbool.h>	//GetAsyncKeyState()
#include <time.h>		//
#include <locale.h>		//本地环境设置,主要是为了宽字符的打印


//方便后续更改
#define WALL L'□'	//墙
#define BODY L'●'	//蛇身
#define FOOD L'★'	//食物
#define POS_X 24	//蛇x
#define POS_Y 5		//蛇y
#define SCR 10
#define TIME 500 


//贪吃蛇
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode, * pSnakeNode;

//游戏状态
enum GAME_STATUS	//枚举
{
	OK,				//正常
	KILL_BY_WALL,	//撞墙
	KILL_BY_SELF,	//撞到自己
	END_NORMAL		//正常退出
};

//蛇的方向
enum DIRECTION	//枚举
{
	UP = 1,		//上
	DOWN,		//下
	LEFT,		//左
	RIGHT		//右
};

//封装⼀个Snake的结构来维护整条贪吃蛇
typedef struct Snake
{
	pSnakeNode _pSnake;			//1.维护蛇身
	pSnakeNode _pFood;			//2.维护食物
	enum DIRECTION _Dir;		//3.蛇的方向
	enum GAME_STATUS _Status;	//4.游戏状态
	int _Socre;					//5.游戏分数
	int _foodWeight;			//6.食物得分
	int _SleepTime;				//7.休眠时间
}Snake, * pSnake;

//游戏初始化
void GameInit(pSnake ps);

//设置光标位置
void SetPos(short x, short y);

//打印欢迎界⾯
void WelcomeToGame();

//创建地图
void CreateMap();

//初始化蛇
void SnakeInit(pSnake ps);

//创建食物
void FoodCreate(pSnake snake);

//游戏运行
void GameRun(pSnake ps);

//蛇移动一步
void MoveSnake(pSnake ps);

//判断是否撞向自己，是返回1，不是返回0
int KillBySelf(pSnake ps,int x,int y);

//蛇吃到食物
void EatFood(pSnake ps,int x,int y);

//蛇正常移动
void NormalMove(pSnake ps,int x,int y);

//打印蛇身
void SnakePrint(pSnakeNode ps);

//蛇身清除
void SnakeCls(pSnakeNode ps);

//游戏维护(结束)
void GameEnd(pSnake ps);
